package com.bestcem.xm.user.service;

import com.bestcem.xm.common.core.domain.web.ServiceResult;
import com.bestcem.xm.user.service.dto.user.*;

import java.util.HashMap;
import java.util.List;

/**
 * SSO单点登录Service
 *
 * @author wangyunyun <yunyun.wang@idiaoyan.com>
 * @version v1.0
 * @date 2022/3/29 10:30
 */
public interface SsoService {

    /**
     * 静默登陆
     *
     * @param orgCode   租户code
     * @param encrypt   加密请求参数
     * @param signature 签名
     * @param signature 签名
     * @return ServiceResult<UserLoginDTO>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/29 11:30
     */
    ServiceResult<UserLoginDTO> silentLogin(String orgCode, String encrypt, String signature, String ipAddress);

    /**
     * 根据凭证获取登录token(CAS)
     *
     * @param orgCode
     * @param ticket
     * @param service
     * @param ipAddress
     * @return ServiceResult<UserLoginDTO>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/29 16:47
     */
    ServiceResult<UserLoginDTO> casLogin(String orgCode, String ticket, String service, String ipAddress);

    /**
     * 设置认证信息
     *
     * @param userDTO
     * @param organizationDTO
     * @return AuthDTO
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/29 17:23
     */
    AuthDTO buildAuthDTO(UserDTO userDTO, OrganizationDTO organizationDTO);

    /**
     * 可选条件获取sso
     *
     * @param dto 查询参数
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Object>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/29 15:33
     */
    ServiceResult<SsoDTO> selectBySelective(SsoDTO dto);

    /**
     * 判断是否是sso登录
     *
     * @param orgCode 公司code
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Object>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/30 1:42
     */
    ServiceResult<HashMap<String, Object>> checkSso(String orgCode);

    /**
     * 根据xm_ticket,sso登录
     *
     * @param orgCode  公司code
     * @param userName 登录用户名
     * @param name     用户姓名
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Object>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/30 1:43
     */
    ServiceResult<Object> getToken(String orgCode, String userName, String name);

    /**
     * 创建用户并关联组
     * XM.apps_mysql.user.util.utils._create_user
     *
     * @param dto         用户信息
     * @param rootGroupId 用户关联组的根组
     * @param groupIdList 用户关联组
     * @param checkParams 是否检验参数
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/30 16:15
     */
    ServiceResult<String> ssoCreateUser(UserDTO dto, String rootGroupId, List<String> groupIdList, Boolean checkParams);

    /**
     * 检查限额并创建用户
     * XM.apps_mysql.user.util.utils.create_user
     *
     * @param dto
     * @param roleIdList
     * @param rootGroupId
     * @param groupIdList
     * @param checkParams
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/7/4 19:04
     */
    ServiceResult<String> createUser(UserDTO dto, List<String> roleIdList, String rootGroupId, List<String> groupIdList, Boolean checkParams);

    /**
     * 创建sso信息
     *
     * @param ssoDTO
     * @return ServiceResult<SsoDTO>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/30 14:40
     */
    ServiceResult<SsoDTO> create(SsoDTO ssoDTO);

    /**
     * 创建sso
     *
     * @param ssoDTO
     * @return ServiceResult<String>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/30 14:55
     */
    ServiceResult<String> insertSelective(SsoDTO ssoDTO);

    /**
     * 通过orgId查询sso信息-状态为启用的
     *
     * @param orgId
     * @return ServiceResult<SsoDTO>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/3/31 9:10 上午
     */
    ServiceResult<SsoDTO> getUsableSsoByOrgId(String orgId);

    /**
     * 更新最近登录时间
     *
     * @param userId 用户Id
     * @param orgId  公司Id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.String>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/3/31 22:54
     */
    ServiceResult<String> updateLastLoginTime(String userId, String orgId);
}
